#version 300 es

// 设置高精度浮点数和整数
precision highp float;
precision highp int;
precision highp sampler3D;

// 输入纹理
uniform sampler2D uTexToRender;  // 2D输入纹理
uniform sampler3D uTex;          // 3D输入纹理
uniform bool uRenderToLayer;     // 是否渲染到特定层
uniform uint uLayer;             // 当前渲染的层
uniform uint uLayersTotal;       // 总层数
uniform float uColMax;           // 最大颜色值
uniform float uColMin;           // 最小颜色值

// 输入和输出变量
in vec3 vTexCoord;              // 纹理坐标
out vec4 color;                 // 输出颜色

// 误差阈值
const float EPSILON = .095;

void main () {
  vec3 vc = vTexCoord;
  
  // 如果渲染到特定层
  if (uRenderToLayer) {
    // 计算标准高度值
    float h = float(uLayer) / float(uLayersTotal);
    float cStandard = (uColMax - uColMin) * h + uColMin;
    
    // 获取实际颜色值
    vec4 cActual = texture(uTexToRender, vTexCoord.xy);
    float avgC = (cActual.x + cActual.y + cActual.z) / 3.;
    
    // 计算与标准值的差异
    float d = cStandard - avgC;
    
    // 如果差异在误差范围内，使用实际颜色
    if (abs(d) < EPSILON) {
      color = cActual;
      color.a = 1.;
    } else {
      // 如果差异大于0，使用黑色
      if (d > 0.) {
        color = vec4(0.);
      } else {
        // 否则调整颜色值
        color = vec4(cActual.xyz - abs(d), 1.);
      }
    }
  } else {
    // 直接渲染3D纹理
    vc.z = .1;
    color = texture(uTex, vc);
  }
}
